home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue63 / System / FrmEnumDisplay.pas < prev   
Encoding:
Pascal/Delphi Source File  |  2000-10-05  |  3.8 KB  |  121 lines

  1. unit FrmEnumDisplay;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   ComCtrls, StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Modes: TListView;
  12.     Label1: TLabel;
  13.     procedure FormCreate(Sender: TObject);
  14.     procedure FormDestroy(Sender: TObject);
  15.     procedure ModesDblClick(Sender: TObject);
  16.   private
  17.     { Private declarations }
  18.     CurMode: TDeviceMode;
  19.     procedure GetDisplayModes;
  20.     function SameMode (Mode1, Mode2: TDeviceMode): Boolean;
  21.   public
  22.     { Public declarations }
  23.   end;
  24.  
  25. var
  26.   Form1: TForm1;
  27.  
  28. implementation
  29.  
  30. {$R *.DFM}
  31.  
  32. function TForm1.SameMode (Mode1, Mode2: TDeviceMode): Boolean;
  33. begin
  34.     Result := (Mode1.dmPelsWidth = Mode2.dmPelsWidth) and
  35.               (Mode1.dmPelsHeight = Mode2.dmPelsHeight) and
  36.               (Mode1.dmBitsPerPel = Mode2.dmBitsPerPel) and
  37.               (Mode1.dmDisplayFrequency = Mode2.dmDisplayFrequency);
  38. end;
  39.  
  40. procedure TForm1.GetDisplayModes;
  41. var
  42.     Idx: Integer;
  43.     DevMode: TDeviceMode;
  44.     PMode: PDeviceMode;
  45.     Item: TListItem;
  46. begin
  47.     Idx := 0;
  48.     while EnumDisplaySettings (Nil, Idx, DevMode) do begin
  49.         New (PMode);
  50.         PMode^ := DevMode;
  51.         Item := Modes.Items.Add;
  52.         Item.Data := PMode;
  53.         Item.Caption := Format ('%d * %d', [DevMode.dmPelsWidth, DevMode.dmPelsHeight]);
  54.         Item.SubItems.Add (IntToStr (DevMode.dmBitsPerPel));
  55.         if not (DevMode.dmDisplayFrequency in [0, 1]) then
  56.             Item.SubItems.Add (IntToStr (DevMode.dmDisplayFrequency) + ' Hz')
  57.         else
  58.             Item.SubItems.Add ('- device default -');
  59.  
  60.         if SameMode (DevMode, CurMode) then Modes.Selected := Item;
  61.         Inc (Idx);
  62.     end;
  63. end;
  64.  
  65. procedure TForm1.FormCreate(Sender: TObject);
  66. const
  67.     Enum_Current_Settings = $FFFFFFFE;
  68. begin
  69.     EnumDisplaySettings (0, Enum_Current_Settings, CurMode);
  70.     GetDisplayModes;
  71. end;
  72.  
  73. procedure TForm1.FormDestroy(Sender: TObject);
  74. var
  75.     Idx: Integer;
  76. begin
  77.     // Trash the mode list
  78.     for Idx := 0 to Modes.Items.Count - 1 do
  79.         Dispose (PDeviceMode (Modes.Items [Idx].Data));
  80. end;
  81.  
  82. procedure TForm1.ModesDblClick(Sender: TObject);
  83. var
  84.     Item: TListItem;
  85.     ModeStr: String;
  86.     NewMode: TDeviceMode;
  87.     DevMode: PDeviceMode;
  88. begin
  89.     Item := Modes.Selected;
  90.     if Item <> Nil then begin
  91.         DevMode := Item.Data;
  92.         with DevMode^ do begin
  93.             ModeStr := Format ('Switch display mode to %d * %d, (%d bpp', [dmPelsWidth, dmPelsHeight, dmBitsPerPel]);
  94.             if not (dmDisplayFrequency in [0, 1]) then ModeStr := ModeStr + Format (', %d Hz refresh', [dmDisplayFrequency]);
  95.             if MessageDlg (ModeStr + ') ?', mtConfirmation, mbOKCancel, 0) = mrOK then begin
  96.                 NewMode := DevMode^;
  97.                 NewMode.dmFields := dm_PelsWidth or dm_PelsHeight or dm_BitsPerPel;
  98.                 if not (dmDisplayFrequency in [0, 1]) then NewMode.dmFields := NewMode.dmFields or DM_DisplayFrequency;
  99.                 case ChangeDisplaySettings (NewMode, cds_UpdateRegistry) of
  100.  
  101.                     Disp_Change_Successful:
  102.                     begin
  103.                         ShowMessage ('The display mode has successfully been changed');
  104.                         Modes.Selected := Item;
  105.                     end;
  106.  
  107.                     Disp_Change_Restart:
  108.                     if MessageDlg ('Need to reboot for display mode change to take effect.  Do it now?', mtConfirmation, mbOKCancel, 0) = mrOK then
  109.                         ExitWindowsEx (ewx_Reboot, 0);
  110.  
  111.                     Disp_Change_BadMode,
  112.                     Disp_Change_Failed:
  113.                     ShowMessage ('Trouble at ''mill - display mode change failed or not supported');
  114.                 end;
  115.             end;
  116.         end;
  117.     end;
  118. end;
  119.  
  120. end.
  121.